package ordinaryArray;

import java.util.Arrays;

/**
 * @author kunkun
 * @className LeetCode_189
 * @Description 轮转数组
 * @date 2025/3/5 9:38
 */
public class LeetCode_189 {

    public void rotate(int[] nums, int k) {
//        solution_1(nums,k);
        solution_2(nums,k);
        printArray(nums);
    }

    public static void main(String[] args) {
        LeetCode_189 object = new LeetCode_189();
        object.rotate(new int[]{1,2,3,4,5,6,7},3);  //5 6 7 1 2 3 4
        object.rotate(new int[]{1,2},3);    //2 1
        object.rotate(new int[]{-1,-100,3,99},2);   //3 99 -1 -100
        object.rotate(new int[]{1,2,3},2);   //2 3 1
    }

    public void printArray(int[] nums){
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i]+" ");
        }
        System.out.println();
    }

    /**
    * @Description: 方法1：使用额外数组，时间复杂度：O（n），空间复杂度：O（n）
    * @Author: kunkun
    * @Date:  2025/3/5 9:42
    * @Parameters:
    * @Return
    * @Throws
    */
    public void solution_1(int[] nums, int k){
        //1. 复制数组
        int[] copyNums = Arrays.copyOfRange(nums,0,nums.length);

        //2. 排除特殊情况
        k=k%nums.length;

        //3. 循环遍历r指针
        int l=0;
        int index = k;
        for (; index < nums.length; index++) {
            //2.1 将copyNums复制给nums
            nums[index]=copyNums[l];
            l++;
        }
        index=0;
        for (; l < nums.length ; l++) {
            nums[index]=copyNums[l];
            index++;
        }
    }

    /**
    * @Description: 方法2：反转数组，时间复杂度：O（n），空间复杂度：O（1）
    * @Author: kunkun
    * @Date:  2025/3/5 10:26
    * @Parameters:
    * @Return
    * @Throws
    */
    public void solution_2(int[] nums, int k){
        //0. 排除特殊情况
        k=k%nums.length;

        //1. 反转整个数组
        reverseArray(nums,0, nums.length-1);

        //2. 反转子数组
        reverseArray(nums,0,k-1);
        reverseArray(nums,k, nums.length-1);
    }

    public void reverseArray(int[] nums, int l,int r){
        //循环
        while(l<r){
            int temp = nums[l];
            nums[l] = nums[r];
            nums[r]=temp;
            l++;r--;
        }
    }

}
